package eteam.aps.service;

import com.baomidou.mybatisplus.extension.service.IService;
import eteam.aps.common.helper.JsonPage;
import eteam.aps.model.dto.SaleDto;
import eteam.aps.model.dto.SaleScanDto;
import eteam.aps.model.entity.sale.SaleOrder;
import eteam.aps.model.export.KV;
import eteam.aps.model.vo.product_number.ProductNumberOrderVo;
import eteam.aps.model.vo.sale.SaleOrderDetailsVo;
import eteam.aps.model.vo.sale.SaleOrderScanDto;
import eteam.aps.model.vo.sale.SaleOrderVo;

import java.util.List;
import java.util.Map;

/**
 * 销售单 Service 接口
 *
 * @author Ll
 * @since 2024/01/09
 */
public interface SaleOrderService extends IService<SaleOrder> {

    /**
     * 添加销售单信息
     *
     * @param sale 销售单
     */
    void saveOrder(SaleDto sale) throws Exception;

    /**
     * 确认已经出库的产品
     *
     * @param scan 扫描的产品
     */
    void confirmSaleBar(SaleScanDto scan) throws Exception;

    /**
     * 查询物料对应的库存信息
     *
     * @param map 查询条件
     * @return 产品库存信息
     */
    List<ProductNumberOrderVo> selectSaleBar(Map<String, Object> map);

    /**
     * 分页条件查询销售单信息
     *
     * @param query 查询条件
     * @param page  页数
     * @param size  条数
     * @return 销售单信息
     */
    JsonPage<SaleOrderVo> selectPage(Map<String, Object> query, int page, int size);

    /**
     * 查询订单详情
     *
     * @param order 订单编号
     * @return 订单详情
     */
    List<SaleOrderDetailsVo> selectOrderDetails(String order);

//    /**
//     * 查询销售订单 产品详情
//     *
//     * @param orderDetailId 产品订单详情
//     * @return 产品条码
//     */
//    List<SaleAlreadyVo> selectOrderProductDetails(String orderDetailId);
//

    /**
     * @since 2025/05/20
     */
    List<KV<String, String>> selectOrderProductDetails(SaleOrderScanDto scan);

    /**
     * 删除销售单
     *
     * @param fId 销售单id
     */
    void deleteSaleOrder(String fId) throws Exception;

    /**
     * 根据物料查询产品库存
     * @param map 查询条件
     * @return 产品库存信息
     */
    List<ProductNumberOrderVo> selectOrderInvProduct(Map<String,Object> map);

    /**
     * 修改发货单
     * @param order 发货单
     */
    void updateSaleOrder(SaleOrder order) throws Exception;

    /**
     * @since 2025/05/20
     * 撤销条码
     * @param scan 扫描
     */
    void cancelOrder(SaleOrderScanDto scan) throws Exception;
}
